#pragma once 

#include<iostream>
#include<string>
#include<sys/types.h>
#include<sys/socket.h>

class Utill{
    public:
    //读取报文的每一行，并带出去
    static int ReadLine(int sock,std::string &out)
    {
        char ch='x';

        //三种末尾截止符的情况：\n or \r or \r\n,统一转化为\n
        while(ch!='\n')
        {
            //套接字文件：存储字符串：存储长度：文件描述符的设置
            ssize_t s=recv(sock,&ch,1,0);
            if(s>0){
                if(ch=='\r'){
                    recv(sock,&ch,1,MSG_PEEK);
                    //向后探查一个字符，看是否是\n，是则为转行
                    if (ch=='\n'){
                        recv(sock,&ch,1,0);
                        //继续读取\n，将\r\n转化为\n    
                    }
                    else{
                        ch='\n';
                    }
                }
                out.push_back(ch);
            }
            else if (s==0)
            {
                return 0;
            }
            else{
                 return -1;
            }
        }

        return out.size();
    }

    static bool CutString(const std::string &target,std::string &sub1_out,std::string &sub2_out,std::string sep)
    //目标分割字符串：带出去的左字符串：带出去的右字符串：分隔符
    {
        size_t pos=target.find(sep);
        if(pos!=std::string::npos);
        {
            sub1_out=target.substr(0,pos);
            sub2_out=target.substr(pos+sep.size());
        }
    }
};
